% !Mode:: "TeX:UTF-8"


\section{直方图均衡化}

\subsection{问题}

\begin{enumerate}
 \item 计算直方图
 \item 实现直方图均衡化算法(需要适用于所有灰度图像)
\end{enumerate}

\subsection[背景原理]{背景原理\footnote{本节摘录自《图像处理和分析》\,章毓晋著\,清华大学出版社 \,1999}}

\subsubsection{直方图计算}

图像的灰度统计直方图是一个1-D的离散函数：

\begin{equation}
p(s_k)=n_k/n \quad k=0,1,\ldots,L-1
\label{hist}
\end{equation}

上式中$s_k$为图形$f(x,y)$的第$k$级灰度值， $n_k$是$f(x,y)$中具有灰度值$s_k$的像素的个数, $n$是图像像素总数。 因为$p(s_k)$给出了对$s_k$出现概率的一个估计， 所以直方图提供了原图像的灰度值分布情况， 也可以说是给出了一幅图像所有灰度值的整体描述。

\subsubsection{直方图均衡化}

直方图均衡化的基本思想是把原始图像的直方图变换为均匀分布的形式， 这样就增加了像素灰度值得动态范围从而达到增强图像整体对比度的效果。将式（$\ref{hist}$）表示为：

\begin{equation}
\begin{split}
p_s(s_k)=n_k/n \quad  & 0 \leq s_k \leq 1 \\
&k=0,1,\ldots,L-1
\end{split}
\end{equation}

这里$p_s(s_k)$代表原始图像第$k$个灰度级的出现概率。 以$n_k$为自变量， 以$p_s(s_k)$为函数得到的曲线就是图像的直方图。

可以看到， 增强函数需要满足两个条件：

\begin{enumerate}
 \item $EH(s)$在$0\leq s \leq L-1$范围内是一个单值单增函数；
 \item 对$0\leq s \leq L-1$有$0 \leq EH(s) \leq L-1$
\end{enumerate}

可以证明累积分布函数(cumulative distribution function,CDF) 满足上述两个条件并能将$s$的分布转换为$t$的均匀分布。 事实上$s$的CDF就是原始图的累积直方图， 在这种情况下有：

\begin{equation}
\label{cdf}
\begin{split}
t_k=EH(s_k)=\sum_{i=0}^k \frac{n_i}{n}=\sum_{i=0}^k p_s(s_i) \quad  & 0 \leq s_k \leq 1 \\
&k=0,1,\ldots,L-1
\end{split}
\end{equation}

由上式可见， 根据原图像直方图可以直接算出直方图均衡化后各像素的灰度值。 当然实际中还要对$t_k$取整以满足数字图像的要求。

\subsubsection{直方图均衡化计算步骤}

设有一幅$64\times64$， 8bit灰度图像， 其直方图均衡化的计算步骤如下表：

%直方图均衡化计算步骤表
\begin{longtable}{|c|c|c|c|c|c|c|c|c|c|}
\caption{\label{tab:hist_equal}直方图均衡化计算列表} \\
\toprule
序号 & 运算 & \multicolumn{8}{|c|}{步骤和结果} \\
\midrule
\endfirsthead
\midrule
序号 & 运算 & \multicolumn{8}{|c|}{步骤和结果} \\
\midrule
\endhead
\midrule
\multicolumn{10}{|c|}{Continued\dots} \\
\endfoot
\endlastfoot
1&列出原始图灰度级$s_k,k=0,1,\ldots,7$ & 0&1&2&3&4&5&6&7\\
\hline
2&统计原始直方图各灰度级像素&790&1023&850&656&329&245&122&81 \\
\hline
3&用式（$\ref{hist}$）计算原始直方图&0.19&0.25&0.21&0.16&0.08&0.06&0.03&0.02\\
\hline
4&计算累计直方图&0.19&0.44&0.65&0.81&0.89&0.95&0.98&1.00\\
\hline
5&取整$t_k=int[(N-1)t_k+0.5]$&1&3&5&6&6&7&7&7\\
\hline
6&确定映射对应关系$(s_k\rightarrow t_k)$&$0\rightarrow 1$&$1\rightarrow 3$&$2\rightarrow
5$&\multicolumn{2}{|c|}{$3,4\rightarrow 6$}&\multicolumn{3}{|c|}{$5,6,7\rightarrow 7$}\\
\hline
7&统计新直方图各灰度级像素$n_k$&&790&&1023&&850&985&448\\
\hline
8&用$p_t(t_k)=n_k/n$计算新直方图&&0.19&&0.25&&0.21&0.24&0.11\\
\bottomrule
\end{longtable}

\subsection{程序代码说明}

根据式（$\ref{hist}$）， 编写计算256级灰度图象直方图的Python函数：hist(image)，输入image为一图像， 输出一长度为256的列表， 依次表示每一灰度级的分布情况

根据式（$\ref{cdf}$）编写计算累计直方图的函数： cumulative\_hist(image)， 输入image为一图像， 输出一长度为256的列表， 依次表示每一灰度级的累计分布情况， 其函数内部用到了hist(image) 来计算直方图。

与根据表（$\ref{tab:hist_equal}$）直方图均衡化步骤表， 编写Python函数hist\_equal(image) 输入image为原图像， 输出被增强后的图像。

具体代码参见 src/q1\_hist\_equal/q1.py 文件


\subsection{实验结果与分析}

\subsubsection{实验结果}

运行 src/q1\_hist\_equal/q1.py 文件， 得到以下结果图像

\begin{longtable}{ll}
\caption{\label{t_hist_equal1}直方图1} \\
\toprule
原直方图 & 直方图均衡化后 \\
\midrule
\endfirsthead
\midrule
原直方图 & 直方图均衡化后 \\
\midrule
\endhead
\midrule
\multicolumn{2}{r}{Continued\dots} \\
\endfoot
\endlastfoot
\includegraphics[width=8cm]{../output/Q1_hist.jpg} &\includegraphics[width=8cm]{../output/Q1_equal_hist.jpg} \\
\bottomrule
\end{longtable}

\begin{longtable}{ll}
\caption{\label{t_hist_equal2}直方图2} \\
\toprule
原直方图 & 直方图均衡化后 \\
\midrule
\endfirsthead
\midrule
原直方图 & 直方图均衡化后 \\
\midrule
\endhead
\midrule
\multicolumn{2}{r}{Continued\dots} \\
\endfoot
\endlastfoot
\includegraphics[width=8cm]{../output/Q12_hist.jpg} &\includegraphics[width=8cm]{../output/Q12_equal_hist.jpg} \\
\bottomrule
\end{longtable}



\begin{longtable}{lll}
\caption{图像结果} \\
%\toprule
%\multicolumn{2}{c}{图像1结果} \\
%\midrule
%\endfirsthead
%\midrule
%\multicolumn{2}{c}{图像1结果} \\
%\midrule
\endhead
\midrule
\multicolumn{3}{r}{接下页\dots} \\
\endfoot
\endlastfoot
\hline
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\begin{tabular}{l}
原图像\\
\includegraphics[height=5cm]{../output/Q1_image.jpg}
\end{tabular}
&
\begin{tabular}{l}
输出图像\\
\includegraphics[height=5cm]{../output/Q1_after_hist_equal.jpg}
\end{tabular}
&
\begin{tabular}{l}
使用Opencv增强后图像\\
\includegraphics[height=5cm]{../output/Q1_use_opencv_hist_equal.jpg}
\end{tabular}
\\
\hline
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\begin{tabular}{l}
原图像\\
\includegraphics[height=5cm]{../output/Q12_image.jpg}
\end{tabular}
&
\begin{tabular}{l}
输出图像\\
\includegraphics[height=5cm]{../output/Q12_after_hist_equal.jpg}
\end{tabular}
&
\begin{tabular}{l}
使用Opencv增强后图像\\
\includegraphics[height=5cm]{../output/Q12_use_opencv_hist_equal.jpg}
\end{tabular}
\\
\bottomrule
\end{longtable}

\subsubsection{分析}

原图像，通过直方图可以看见整体偏暗， 但是最高灰度仍有很多分布。 直方图均衡化后，分布范围扩大了，同时像素也向偏亮区域移动。

从结果图像上来比较， 可见所编写的增强函数与OpenCV系统所提供的结果一致。 与原图像比较，在图像中央能分辨出原来不能看出的结构。

同时，也产生了许多不期望的暗点， 降低了图像质量。 所以， 在以后需要进行进一步的工作，改进算法（如直方图规定化算法）， 来增强图像。













